﻿package com.zouloux.graphics.menu.views
{
	import com.zouloux.core.data.DataCollection;
	import com.zouloux.core.data.IDataCollection;
	import com.zouloux.core.events.DataEvent;
	import com.zouloux.core.masters.IController;
	import com.zouloux.core.masters.MasterModel;
	import com.zouloux.core.masters.MasterView;
	import com.zouloux.core.navigation.MenuItem;
	import com.zouloux.graphics.menu.controllers.MenuBuilderController;
	import flash.display.MovieClip;
	import flash.text.TextFieldAutoSize;
	
	/**
	 * ...
	 * @author ZoulouX
	 */
	public class MenuBuilderView extends MasterView
	{
		/**
		 * La liste des boutons
		 */
		protected var _buttons				:Array					= [];
		
		/**
		 * La liste des items graphiques
		 */
		protected var _items				:Array					= [];
		
		/**
		 * Méthode d'alignement
		 */
		protected var _align				:String					= TextFieldAutoSize.LEFT;
		
		/**
		 * La marge
		 */
		protected var _margin				:uint					= 5 ;
		
		/**
		 * La classe des items
		 */
		protected var _menuItemClass		:Class;
		
		/**
		 * La classe des séparators
		 */
		protected var _separatorClass		:Class
		
		/**
		 * La position de départ
		 */
		protected var _xStart				:Number					= 0;
		
		/**
		 * La position verticale
		 */
		protected var _yStart				:Number					= 0
		
		/**
		 * Autoriser l'instanciation d'un dernier séparateur
		 */
		protected var _allowLastSeparator	:Boolean				= false;
		
		
		/**
		 * La classe des items
		 */
		public function get menuItemClass():Class { return _menuItemClass; }
		public function set menuItemClass(value:Class):void 
		{
			_menuItemClass = value;
		}
		
		/**
		 * La classe des séparators
		 */
		public function get separatorClass():Class { return _separatorClass; }
		public function set separatorClass(value:Class):void 
		{
			_separatorClass = value;
		}
		
		/**
		 * Méthode d'alignement
		 */
		public function get align():String { return _align; }
		public function set align(value:String):void 
		{
			_align = value;
		}
		
		/**
		 * La marge
		 */
		public function get margin():uint { return _margin; }
		public function set margin(value:uint):void 
		{
			_margin = value;
		}
		
		/**
		 * La position de départ
		 */
		public function get xStart():Number { return _xStart; }
		public function set xStart(value:Number):void 
		{
			_xStart = value;
		}
		
		/**
		 * La position verticale
		 */
		public function get yStart():Number { return _yStart; }
		public function set yStart(value:Number):void 
		{
			_yStart = value;
		}
		
		/**
		 * La liste des boutons
		 */
		public function get buttons():Array { return _buttons; }
		public function set buttons(value:Array):void 
		{
			_buttons = value;
		}
		
		
		/**
		 * Le constructeur
		 * @param	pController : le controlleur avec son modèle
		 */
		public function MenuBuilderView (pController:MenuBuilderController)
		{
			// Enregistrer le controller
			_controller = pController;
			
			// Passer l'instance de cette vue
			pController.view = this;
		}
		
		/**
		 * Construire le menu
		 */
		public function build ():void
		{
			// Récupérer la collection
			var collection:IDataCollection = (_controller as MenuBuilderController).getCollection();
			
			// Le X de départ
			var prevX:uint = _xStart;
			
			// Parcourir la collection
			for each (var menuItem:MenuItem in collection.all)
			{
				// Instancier le bouton
				var menuButton:MenuItemButton = new _menuItemClass (menuItem, TextFieldAutoSize.LEFT) as MenuItemButton;
				
				// Placer le bouton
				if (_align == TextFieldAutoSize.RIGHT)
					menuButton.x = prevX - menuButton.realWidth - _margin;
				else
					menuButton.x = prevX;
				
				// Appliquer la position verticale
				menuButton.y = _yStart;
				
				// Ajouter le bouton
				addChild(menuButton);
				
				// Ajouter à la liste
				_items.push(menuButton);
				_buttons.push(menuButton);
				
				// Ajouter le séparator s'il existe
				if (_separatorClass != null && (collection.getIndex(menuItem) <  collection.length - 1 || _allowLastSeparator))
				{
					// Instancier le séparator
					var separator:MovieClip = new _separatorClass ();
					
					// Placer le séparator
					if (_align == TextFieldAutoSize.RIGHT)
						separator.x = menuButton.x - _margin / 2;
					else
						separator.x = menuButton.x + menuButton.realWidth + _margin / 2;
					
					// Appliquer la position verticale
					separator.y = _yStart;
					
					// Ajouter le séparator
					addChild(separator);
					
					// Ajouter à la liste
					_items.push(separator);
				}
				
				// Se souvenir de sa position
				if (_align == TextFieldAutoSize.RIGHT)
					prevX = menuButton.x;
				else
					prevX = menuButton.x + menuButton.realWidth + _margin;
			}
		}
		
		/**
		 * Ce menu n'est plus valide
		 */
		public function unvalidate ():void
		{
			
		}
		
		/**
		 * Ce menu est validé
		 */
		public function validate ():void
		{
			
		}
		
		/**
		 * Le bouton séléctionné change
		 */
		public function selectButton (pButton:MenuItemButton):void
		{
			
		}
	}
}